package com.xbongbong.pay.platform.wechatpay.pojo.request.partner;

import com.alibaba.fastjson.annotation.JSONField;
import com.xbongbong.pay.platform.wechatpay.pojo.request.WeChatBaseRequest;
import lombok.Getter;
import lombok.Setter;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 *
 * @author 魏荣杰
 * @date 2021/2/5 17:15
 * @since
 * @version
 */
@Getter
@Setter
public class WeChatPayPartnerTransactionsRequest extends WeChatBaseRequest {
    private static final long serialVersionUID = 3944495604017805581L;

    /**
     * 服务商申请的公众号或移动应用appid。
     * 示例值：wx8888888888888888
     */
    @NotNull
    @Size(min = 1, max = 32)
    @JSONField(name = "sp_appid")
    private String spAppId;

    /**
     * 服务商户号，由微信支付生成并下发
     * 示例值：1230000109
     */
    @NotNull
    @Size(min = 1, max = 32)
    @JSONField(name = "sp_mchid")
    private String spMchId;

    /**
     * 子商户申请的公众号或移动应用appid。如果传入sub_openid，则sub_appid必传
     * 示例值：wxd678efh567hg6999
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_appid")
    private String subAppId;

    /**
     * 子商户的商户号，由微信支付生成并下发。
     * 示例值：1900000109
     */
    @NotNull
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_mchid")
    private String subMchId;

    /**
     * 商品描述
     * 示例值：Image形象店-深圳腾大-QQ公仔
     */
    @NotBlank
    @Size(min = 1, max = 127)
    private String description;

    /**
     * 商户系统内部订单号，只能是数字、大小写字母_-*且在同一个商户号下唯一
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 6, max = 32)
    @JSONField(name = "out_trade_no")
    private String outTradeNo;
    /**
     * 订单失效时间，遵循rfc3339标准格式，格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE，YYYY-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日 13点29分35秒。
     * 示例值：2018-06-08T10:34:56+08:00
     */
    @Size(min = 1, max = 64)
    @JSONField(name = "time_expire")
    private String timeExpire;
    /**
     * 附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用
     * 示例值：自定义数据
     */
    @Size(min = 1, max = 128)
    private String attach;
    /**
     * 通知URL必须为直接可访问的URL，不允许携带查询串。
     * 格式：URL
     * 示例值：https://www.weixin.qq.com/wxpay/pay.php
     */
    @NotBlank
    @Size(min = 1, max = 256)
    @JSONField(name = "notify_url")
    private String notifyUrl;
    /**
     * 订单优惠标记
     * 示例值：WXG
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "goods_tag")
    private String goodsTag;

    /**
     * 结算信息
     */
    @Valid
    @JSONField(name = "settle_info")
    private SettleInfo settleInfo;

    /**
     * 订单金额信息
     */
    @NotNull
    @Valid
    private Amount amount;

    @NotNull
    @Valid
    private Payer payer;

    /**
     * 优惠功能
     */
    @Valid
    private Detail detail;
    /**
     * 支付场景描述
     */
    @JSONField(name = "scene_info")
    @Valid
    private SceneInfo sceneInfo;

    @Setter
    @Getter
    public static class SettleInfo {
        /**
         * 是否指定分账，枚举值
         * true：是
         * false：否
         * 示例值：true
         */

        @JSONField(name = "profit_sharing")
        private String profitSharing;

    }

    @Setter
    @Getter
    public static class Amount {
        /**
         * 订单总金额，单位为分。
         * 示例值：100
         */
        @NotNull
        private Integer total;
        /**
         * CNY：人民币，境内商户号仅支持人民币。
         * 示例值：CNY
         */
        @Size(min = 1, max = 16)
        private String currency;

        public Amount(Integer total, String currency) {
            this.total = total;
            this.currency = currency;
        }
    }

    @Setter
    @Getter
    public static class Payer {
        /**
         * 用户在服务商appid下的唯一标识。
         * 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
         */
        @Size(min = 1, max = 128)
        @JSONField(name = "sp_openid")
        private String spOpenId;

        /**
         * 用户在子商户appid下的唯一标识。 如果传入sub_openid，则sub_appid必传
         * 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
         */
        @Size(min = 1, max = 128)
        @JSONField(name = "sub_openid")
        private String subOpenId;
    }

    @Setter
    @Getter
    public static class Detail {

        /**
         * 1、商户侧一张小票订单可能被分多次支付，订单原价用于记录整张小票的交易金额。
         * 2、当订单原价与支付金额不相等，则不享受优惠。
         * 3、该字段主要用于防止同一张小票分多次支付，以享受多次优惠的情况，正常支付订单不必上传此参数。
         * 示例值：608800
         */
        @JSONField(name = "cost_price")
        private Integer costPrice;
        /**
         * 商家小票ID
         * 示例值：微信123
         */
        @Size(min = 1, max = 32)
        @JSONField(name = "invoice_id")
        private String invoiceId;

        /**
         * 单品列表信息
         * 条目个数限制：【1，undefined】
         */
        @JSONField(name = "goods_detail")
        @Valid
        private List<GoodsDetail> goodsDetail;

        @Setter
        @Getter
        public class GoodsDetail {

            /**
             * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
             * 示例值：商品编码
             */
            @NotBlank
            @Size(min = 1, max = 32)
            @JSONField(name = "merchant_goods_id")
            private String merchantGoodsId;

            /**
             * 微信支付定义的统一商品编号（没有可不传）
             * 示例值：1001
             */
            @Size(min = 1, max = 32)
            @JSONField(name = "wechatpay_goods_id")
            private String wechatpayGoodsId;
            /**
             * 商品的实际名称
             * 示例值：iPhoneX 256G
             */
            @Size(min = 1, max = 256)
            @JSONField(name = "goods_name")
            private String goodsName;

            /**
             * 用户购买的数量
             * 示例值：1
             */
            @NotNull
            private Integer quantity;

            /**
             * 商品单价，单位为分
             * 示例值：828800
             */
            @NotNull
            private Integer unitPrice;
        }
    }

    @Setter
    @Getter
    public static class SceneInfo {

        /**
         * 用户的客户端IP，支持IPv4和IPv6两种格式的IP地址。
         * 示例值：14.23.150.211
         */
        @NotBlank
        @Size(min = 1, max = 45)
        @JSONField(name = "payer_client_ip")
        private String payerClientIp;
        /**
         * 商户端设备号（门店号或收银设备ID）。
         * 示例值：013467007045764
         */
        @Size(min = 1, max = 32)
        @JSONField(name = "device_id")
        private String deviceId;
        /**
         * 商户门店信息
         */
        @JSONField(name = "store_info")
        @Valid
        private StoreInfo storeInfo;

        @Setter
        @Getter
        public static class StoreInfo {
            /**
             * 商户侧门店编号
             * 示例值：0001
             */
            @NotBlank
            @Size(min = 1, max = 32)
            private String id;

            /**
             * 商户侧门店名称
             * 示例值：腾讯大厦分店
             */
            @Size(min = 1, max = 256)
            private String name;
            /**
             * 地区编码，详细请见省市区编号对照表。
             * 示例值：440305
             */
            @Size(min = 1, max = 32)
            @JSONField(name = "area_code")
            private String areaCode;
            /**
             * 详细的商户门店地址
             * 示例值：广东省深圳市南山区科技中一道10000号
             */
            @Size(min = 1, max = 512)
            private String address;
        }

    }
}
